// Copyright 2022 a.o.smith ALL Rights Reserved
package com.liuxinlong.modules.system.service;

import com.liuxinlong.modules.entity.MessageConfiguration;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

/**
 * 推送消息service接口
 *
 * @author liuxinlong@hotwater.com.cn
 * @version 1.0.0
 * @since 2022年12月12日
 */
public interface MessageService {
    /**
     * 查询消息推送配置列表
     *
     * @param queryParam 查询参数
     * @return 消息推送配置列表
     */
    List<Map<String, Object>> pageMessage(Map<String, Object> queryParam);

    /**
     * 查询消息推送配置数量
     *
     * @param queryParam 查询参数
     * @return 消息推送配置数量
     */
    int getMessageCount(Map<String, Object> queryParam);

    /**
     * 新增消息推送配置
     *
     * @param messageConfiguration 消息推送配置
     * @param targetDepartment     目标部门
     * @param targetRole           目标角色
     * @param targetUser           目标用户
     */
    void addMessage(MessageConfiguration messageConfiguration, String targetDepartment, String targetRole, String targetUser);

    /**
     * 修改消息推送配置
     *
     * @param messageConfiguration 消息推送配置
     * @param targetDepartment     目标部门
     * @param targetRole           目标角色
     * @param targetUser           目标用户
     */
    void updateMessage(MessageConfiguration messageConfiguration, String targetDepartment, String targetRole, String targetUser);

    /**
     * 删除消息推送配置
     *
     * @param id 消息推送配置id
     */
    void deleteMessage(String id);

    /**
     * 修改消息推送配置状态
     *
     * @param id 消息推送配置id
     */
    void updateMessageStatus(String id);

    /**
     * 自动添加消息推送
     *
     * @param businessId   业务id
     * @param businessType 业务类型
     */
    void addMessageAuto(String businessId, int businessType);

    /**
     * 查询消息推送目标受众配置
     *
     * @param messageId 消息推送配置id
     * @return 消息推送目标受众配置
     */
    Map<String,Object> queryTargetMap(String messageId);

    /**
     * 查询消息推送业务信息
     *
     * @param businessType 业务类型
     * @return 消息推送业务信息
     */
    List<Map<String,Object>> queryBusinessList(String businessType);

    /**
     * 消息定时发送
     */
    void delayedSendingMessage();

    /**
     * 撤回消息
     *
     * @param id 消息推送记录id
     * @param messageId 消息推送配置录id
     */
    void revokeMessage(String id,String messageId);

    /**
     * 导出消息推送信息列表
     *
     * @param response response
     */
    void exportMessageList(HttpServletResponse response);

    /**
     * 查询消息推送记录列表
     *
     * @param queryParam 查询参数
     * @return 消息推送记录列表
     */
    List<Map<String, Object>> pageMessagePushRecord(Map<String, Object> queryParam);

    /**
     * 查询消息推送记录数量
     *
     * @param queryParam 查询参数
     * @return 消息推送记录数量
     */
    int getMessagePushRecordCount(Map<String, Object> queryParam);

    /**
     * 消息打包发送
     */
    void packageSendingMessage();

    /**
     * 查询消息推送失败记录列表
     *
     * @param queryParam 查询参数
     * @return 消息推送失败记录列表
     */
    List<Map<String, Object>> pageMessagePushFailedLog(Map<String, Object> queryParam);

    /**
     * 查询消息推送失败记录数量
     *
     * @param queryParam 查询参数
     * @return 消息推送失败记录数量
     */
    int getMessagePushFailedLogCount(Map<String, Object> queryParam);
}
